#ifndef __HEAD_H__
#define __HEAD_H__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <strings.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#define ARGS_CHECK(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}
#define ERROR_CHECK(ret,retval,func_name) {if(ret==retval) {fflush(stdout);perror(func_name);return -1;}}
#define THREAD_ERR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed,%d %s\n",func_name,ret,strerror(ret));return -1;}}
#define SELFFUNC_ERR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed\n",func_name);return -1;}}

#define FILENAME "file"
#define PORT 2000
#define THREAD_NUM 5
#define CAPACITY 100

typedef struct{//传输文件用小火车
    int data_len;
	char buf[1000];
}train_t;

enum command
{
    LS,
    CD,
    PWD,
    REMOVE,
    GETS,
    PUTS
}CMD;

//带有状态码的火车
typedef struct{
    int data_len;//存放buf，也就是火车车厢中数据长度
    int state;//状态码
    enum command cmd_type;
    char buf[1000];//火车车厢长度
    char belongID[20];//所属客户端子线程ID
    char file_name[100];//文件名
}train_state_t;

//针对每个客户端需要有状态维护
typedef struct{
    int new_fd;//对应客户端连接
    char path[100];//路径，给cd服务的，pwd服务的
    int code;//code为0代表是根，code为正，直接数据库select
    char token[100];//一旦登录，随机生成一个token并发送给客户端
}Client_State_t;

#endif